package StructuralPatterns.Proxy.JDKProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

//  维护一个目标对象
  private Object target;

  public ProxyFactory(Object target) {
    this.target = target;
  }

  public Object getProxyInstance() {
    return Proxy.newProxyInstance(
            target.getClass().getClassLoader(),//指定当前目标对象使用类加载器,获取加载器的方法是固定的
            target.getClass().getInterfaces(),//目标对象实现的接口的类型,使用泛型方式确认类型
            new InvocationHandler() {//事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
              @Override
              public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始JDK代理");
                Object invoke = method.invoke(target, args);
                return invoke;
              }
            }
    );
  }
}
